﻿#pragma once
#include <cstdint>

// c++ lang
#ifdef __cplusplus

// 整数
using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;

// 无符号整数
using u8 = uint8_t;  // 八位字节，一般用于处理 UTF-8 数据
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;

// 浮点数
using f32 = float;
using f64 = double;

using c16 = char16_t;    // 16 位字符
using b32 = int32_t;     // 32 位布尔值
using uptr = uintptr_t;  //
//using byte = char;
using size = ptrdiff_t;  // 指针偏移
using usize = size_t;    // 用于与需要无符号大小值的外部接口进行交互。

// c lang
#else

//==================== integer
// 整数
typedef int8_t i8;
typedef int16_t i16;
typedef int32_t i32;
typedef int64_t i64;

// 无符号整数
typedef uint8_t u8;  // 八位字节，一般用于处理 UTF-8 数据
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

// 字符
typedef char16_t c16;  // 16 位字符
// bool 值
typedef int32_t b32;  // 32 位布尔值

//======================== float
typedef float f32;
typedef double f64;

// 指针类型
typedef uintptr_t uptr;  //
typedef char byte;
typedef ptrdiff_t size;  // 指针偏移量
typedef size_t usize;    // 用于与需要无符号大小值的外部接口进行交互。

#endif

// standard macros
#define Myszof(x) (size)sizeof(x)             // signed size of
#define Myalnof(x) (size) _Alignof(x)         // my align of
#define My1len(x) (sizeof(a) / sizeof(*(a)))  // 数组 size, 1 based length
#define My0len(s) (countof(s) - 1)            // my length of, 0 based length

// assert
#define Myasrt(c) \
    while (!(c)) __builtin_unreachable()

/*不需要为调试构建和发行构建分别定义。由“未定义行为检查器”（UBSan）的存在性控制，后者仅存在于调试构建中。
libubsan 提供了诊断输出，自带文件名和行号。
在发行构建中，它会变成优化提示。
如果想在发行构建中启用断言，
可以通过 -fsanitize-trap 将 UBSan 设置为陷阱模式，
然后启用 -fsanitize=unreachable。
理论上这也可以通过-funreachable-traps 实现*/
//#define assert(c) while (!(c)) __builtin_unreachable()